package org.swust.sysmonitorapp.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.swust.sysmonitorapp.dto.SysUserDto;
import org.swust.sysmonitorapp.entity.CountDepartment;
import org.swust.sysmonitorapp.entity.QSysUser;
import org.swust.sysmonitorapp.entity.R;
import org.swust.sysmonitorapp.entity.SysUser;
import org.swust.sysmonitorapp.service.ISysUserService;

import java.util.List;


/**
 * 用户表 前端控制器
 *
 * @since 2024-12-24
 */
@RestController //前后端分离的，返回纯数据和controller不一样
@RequestMapping("/user") //指明访问的路径
public class SysUserController {
    @Autowired
    private ISysUserService userService;

    /**
     * 通过id查询用户信息
     *
     * @param id 用户id
     * @return 用户信息
     */
    @GetMapping("/{id}")
    public R<SysUser> getById(@PathVariable(name = "id") Integer id) {
        return R.ok(userService.getById(id));
    }

    /**
     * 分页查询用户
     *
     * @param page    参数集
     * @param qSysUser 查询参数列表
     * @return 用户集合
     */
    @GetMapping("/page")
    public R<IPage<SysUserDto>> getUserPage(Page page, QSysUser qSysUser) {
        return R.ok(userService.pageUser(page, qSysUser));
    }

    /**
     * 添加用户
     *
     * @param user 用户信息
     * @return success/false
     */
    @PostMapping
    @Transactional //让语句拥有原子性，使人数加一和用户添加是同样的事务
    public R<Boolean> saveUser(@RequestBody SysUser user) {
//        //判断部门是否存在然后加一的一种方法
//        if (departmentService.getById(user.getDeptId()) == null) {
//            departmentService.changeCount(user.getDeptId(), 1);
//        }
        //另一种方法 通过重写save方法,就直接重写save方法，不用在这里判断
        return R.ok(userService.save(user));
    }

    /**
     * 更新用户信息
     *
     * @param user 用户信息
     * @return R
     */
    @PutMapping
    public R<Boolean> updateUser(@Valid @RequestBody SysUser user) {
        return R.ok(userService.updateById(user));
    }

    /**
     * 更新用户密码
     *
     * @param id 用户id
     * @param password 用户密码
     * @return R
     */
    @PutMapping("/password")
    public R<Boolean> updatePassword(Integer id, String password) {
        return R.ok(userService.editPassword(id, password));
    }

    /**
     * 删除用户
     *
     * @param id 用户id
     * @return R
     */
    @DeleteMapping("/{id}")
    @Transactional
    public R<Boolean> delUser(@PathVariable Integer id) {
        //departmentService.changeCount(userService.getById(id).getDeptId(), -1);
        return R.ok(userService.removeById(id));
    }

    /**
     * 按照部门分组查人数
     *
     * @return List<SysDepartment>
     */
    @GetMapping("/countDepartment")
    public R<List<CountDepartment>> countDepartment() {
        return R.ok(userService.countDepartment());
    }

    /**
     * 重置密码
     *
     * @param id 用户id
     * @return R
     */
    @PutMapping("/resetPassword")
    //@PreAuthorize("hasRole('admin')") 老师没做授权，这里就是做授权的地方
    public R<Boolean> resetPwd(Integer id) {
        return R.ok(userService.resetPwd(id));
    }
}
